package priv.wjh.test.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @use 利用Java代码给图片添加文字(透明图调低点, 也可以当做水印)
 */
@Slf4j
public class WaterMarkUtils {
    /**
     * 编辑图片,往指定位置添加文字
     *
     * @param list :文字集合
     */
    public static void writeImage(OutputStream outputStream, List<ImageDTO> list) throws IOException {
        HttpClient httpClient = new DefaultHttpClient();

        HttpGet request = new HttpGet("http://img.pre.seatent.com/statics/6b8b4690e7a727e3a330a308fe136a2e/attachment/upload/image/invoice_base_img.png");

        HttpResponse httpResponse = httpClient.execute(request);

        try {
            Image srcImg = ImageIO.read(httpResponse.getEntity().getContent());//文件转化为图片
            int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
            int srcImgHeight = srcImg.getHeight(null);//获取图片的高

            //添加文字:
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            for (ImageDTO imgDTO : list) {
                g.setColor(imgDTO.getColor());                                  //根据图片的背景设置水印颜色
                g.setFont(imgDTO.getFont());                                    //设置字体
                g.drawString(imgDTO.getText(), imgDTO.getX(), imgDTO.getY());   //画出水印
            }
            g.dispose();

            // 输出图片
            ImageIO.write(bufImg, "jpg", outputStream);
        }
        catch (Exception e) {
            log.error("==== 系统异常::{} ====", e);
        }
    }

    /**
     * 创建ImageDTO, 每一个对象,代表在该图片中要插入的一段文字内容:
     *
     * @param text  : 文本内容;
     * @param color : 字体颜色(前三位)和透明度(第4位,值越小,越透明);
     * @param font  : 字体的样式和字体大小;
     * @param x     : 当前字体在该图片位置的横坐标;
     * @param y     : 当前字体在该图片位置的纵坐标;
     * @return
     */
    public static ImageDTO createImageDTO(String text, Color color, Font font, int x, int y) {
        ImageDTO imageDTO = new ImageDTO();
        imageDTO.setText(text);
        imageDTO.setColor(color);
        imageDTO.setFont(font);
        imageDTO.setX(x);
        imageDTO.setY(y);
        return imageDTO;
    }


    /**
     * main方法:
     *
     * @param args
     */
    public static void main(String[] args) throws IOException {

        //=========================================自行发挥================================
        //todo 自己真实的地址:(如果项目中使用的阿里云,则自行改造'writeImage'方法,接受流对象就好了);
        String srcImgPath = "http://img.pre.seatent.com/statics/6b8b4690e7a727e3a330a308fe136a2e/attachment/upload/image/invoice_base_img.png";    //源图片地址
        String tarImgPath = "D:\\tupian\\形式发票底图33.zip";   //目标图片的地址
        //==============================================================================

        //获取数据集合；
        ArrayList<ImageDTO> list = new ArrayList<>();
        list.add(createImageDTO("小八嘎企业", Color.BLACK, new Font("黑体", Font.PLAIN, 14), 190, 197));
        list.add(createImageDTO("浙江省杭州市西湖区黄龙体育馆11幢201", Color.BLACK, new Font("黑体", Font.PLAIN, 14), 120, 240));
        list.add(createImageDTO("知章 15673211038", Color.BLACK, new Font("黑体", Font.PLAIN, 14), 650, 197));
        list.add(createImageDTO("2023年09月14日", Color.BLACK, new Font("黑体", Font.PLAIN, 14), 660, 275));
        list.add(createImageDTO("银联支付", Color.BLACK, new Font("黑体", Font.PLAIN, 14), 260, 340));
        list.add(createImageDTO("上海银行", Color.BLACK, new Font("黑体", Font.PLAIN, 14), 680, 340));
        list.add(createImageDTO("￥50.00", Color.BLACK, new Font("黑体", Font.PLAIN, 14), 725, 522));
        list.add(createImageDTO("￥50.00", Color.BLACK, new Font("黑体", Font.PLAIN, 14), 725, 602));

        //操作图片:
        FileOutputStream fileOutputStream = new FileOutputStream(tarImgPath);

//        WaterMarkUtils.writeImage(fileOutputStream, list);
//        fileOutputStream.flush();
//        fileOutputStream.close();

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] byteArray;
        WaterMarkUtils.writeImage(outputStream, list);
        byteArray = outputStream.toByteArray();
        InputStream inputStream = new ByteArrayInputStream(byteArray);

        zipFiles(Collections.singletonList(inputStream), fileOutputStream);

        //这句代码,自己项目中可以不用加,在这里防止main方法报错的;
        System.exit(0);
    }


    public static void zipFiles(List<InputStream> inputStreams, OutputStream outputStream) {
        // 创建 ZipOutputStream
        ZipOutputStream zipOutputStream = null;
        // 创建 InputStream 对象
        InputStream fileInputStream = null;

        try {
            // 实例化 ZipOutputStream 对象
            zipOutputStream = new ZipOutputStream(outputStream);
            // 创建 ZipEntry 对象
            ZipEntry zipEntry = null;
            // 遍历源文件数组
            for (int i = 0; i < inputStreams.size(); i++) {
                // 将源文件数组中的当前文件读入 FileInputStream 流中
                fileInputStream = inputStreams.get(i);
                // 实例化 ZipEntry 对象，源文件数组中的当前文件
                if (i == 0){
                    zipEntry = new ZipEntry("形式发票.jpg");
                }else {
                    zipEntry = new ZipEntry("形式发票.xls");
                }
                zipOutputStream.putNextEntry(zipEntry);
                // 该变量记录每次真正读的字节个数
                int len;
                // 定义每次读取的字节数组
                byte[] buffer = new byte[1024];
                while ((len = fileInputStream.read(buffer)) > 0) {
                    zipOutputStream.write(buffer, 0, len);
                }
            }
            zipOutputStream.closeEntry();
            zipOutputStream.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}


